/*********************************************************************************************//**
*\file SensorCom.h
*\author Daneluzzi F., Pelloux-Prayer J., Battandier P.
*\version 1
*\date janvier 2012
*\brief Bibliothèque contenant les fonctions utilis�e par les capteurs dans leur programme principal.
*************************************************************************************************/

#ifndef SENSORCOM_H_INCLUDED
#define SENSORCOM_H_INCLUDED

#include <stdio.h>
#include <stdlib.h>

#ifdef SENSOR_PC
    #include "../Util/lienSeriePC.h"
    #include "../Util/gestionTempsPC.h"
#else
    #include "../Util/lienSerieMC.h"
    #include "../Util/gestionTempsMC.h"

#endif

#include "../Util/comAPI.h"
#include "../Util/utilAPI.h"
#include "../Util/leds.h"

#define SENSOR_DATA_PACKET          0x01
#define SENSOR_REGISTER_REQUEST     0x02
#define SENSOR_UNREGISTER_REQUEST   0x03
#define COORD_REGISTER_RESPONSE     0x04
#define COORD_DATA_REQUEST          0x05

#define REGISTER_SUCCESS            0x00
#define REGISTER_FAILURE            0x01

/*********************************************************************************************//**
* \func: sendInfoToCoordinator
*
* \brief Cette fonction permet de transmettre une chaîne de caractère au coordinateur.
* On ne transmet pas le 0 de fin de chaîne.
*
* PARAMETRES :
* \param [in] char *info : info à transmettre au coordinateur
**************************************************************************************************/
void sendInfoToCoordinator(unsigned char *info, int dataLen);


/*********************************************************************************************//**
* \func: setNodeId
*
* \brief Cette fonction envoie une commande AT pour modifier la valeur de NI.
*
* PARAMETRES :
* \param [in] nodeId : la nouvelle valeur du node ID (ne doit pas avoir une longueur de plus de 20 caractères).
*************************************************************************************************/
void setNodeId(unsigned char *nodeId);

/*********************************************************************************************//**
* \func: getNodeId
*
* \brief Cette fonction envoie une commande AT pour récupérer la valeur de NI.
*************************************************************************************************/
void getNodeId(void);

/*********************************************************************************************//**
* \func: sendSensorData
*
* \brief Cette fonction récupère les mesures des capteurs, et envoie au coordinateur ces données.
*************************************************************************************************/
void sendSensorData(void);

/*********************************************************************************************//**
* \func: sendRequestRegister
*
* \brief Cette fonction envoie une trame d'enregistrement au coordinateur.
*************************************************************************************************/
void sendRequestRegister(void);

/*********************************************************************************************//**
* \func: initSensor
*
* \brief Cette fonction initialise la carte capteur.
* Initialise les variables globales, le timer 0 pour gérer les timeout et
* l'USART 1 pour la communication avec le module XBee
*************************************************************************************************/
void initSensor(void);

/*********************************************************************************************//**
* \func: registerDevice
*
* \brief (en mode API) Cette fonction gère l'enregistrement auprès du coordinateur
* La phase d'enregistrement se fait en 5 tentatives. Le capteur envoie une trame
* d'enregistrement au coordinateur. Puis il scrute une réponse du coordinateur.
* si il n'y en pas, on réessaye en renvoyant une nouvelle trame d'enregistrement
* Après 5 tentatives infructueuses, on arrête l'enregistrement et on se
* considère comme non-enregistré.
* Le résultat de cette fonction est la modification de la variable globale 
* gl_Registered : 1 = enregistré, 0 = pas enregistré.
*************************************************************************************************/
void registerDevice(void);

/*********************************************************************************************//**
* \func: unregisterDevice
*
* \brief (en mode API) Cette fonction gère le désenregistrement du capteur 
* auprès du coordinateur. Le capteur envoie une trame de désenregistrement et 
* il passe en mode désenregistré.
* Le résultat de cette fonction est la suppression de l'entrée correspondant au
* capteur de la table de routage du coordinateur ainsi que la remise à 0 de la
* variable globale gl_Registered.
*************************************************************************************************/
void unregisterDevice(void);

/*********************************************************************************************//**
* \func: handleDataPacket
*
* \brief Cette fonction gère les commandes reçues sur XBee et effectue les traitements
* Le protocole réseau contient 3 types de trame :
* COORD_REGISTER_RESPONSE : Réponse du coordinateur à une requête d'enregistrement
* COORD_DATA_REQUEST : Requête du coordinateur  (demande d'envoi des données capteurs
*************************************************************************************************/
void handleDataPacket(void);

/*********************************************************************************************//**
* \func: getTimeToSleep
*
* \brief Récupère le temps d'endormissement
* \return Le temps d'endormissement
*************************************************************************************************/
int getTimeToSleep(void);

/*********************************************************************************************//**
* \func: setTimeToSleep
*
* \brief Spécifie le temps d'endormissement
*
* \param [in] tts : Temps d'endormissement
*************************************************************************************************/
void setTimeToSleep(int tts);

/*********************************************************************************************//**
* \func: getSleepPeriod
*
* \brief Récupère la durée d'une periode d'endormissement
*
* \return La periode d'endormissement
*************************************************************************************************/
int getSleepPeriod(void);

/*********************************************************************************************//**
* \func: setTimeToSleep
*
* \brief Changer la periode d'endormissement
*
* \param [in] sp : Periode d'endormissement
*************************************************************************************************/
void setSleepPeriod(int sp);

/*********************************************************************************************//**
* \func: getSample
*
* \brief Récupère les mesures de capteurs
*
* \param [out] buff : Mesures du capteurs.
* \return Tailles des mesures
*************************************************************************************************/
int getSample(unsigned char *buff);
#endif // SENSORCOM_H_INCLUDED
